from abc import ABC, abstractmethod
from typing import List, Dict, Any
import logging
from dotenv import load_dotenv

logger = logging.getLogger(__name__)

# 加载.env文件中的环境变量
load_dotenv()

class BaseLLMService(ABC):
    """LLM服务基类"""
    
    @abstractmethod
    def chat(self, messages: List[Dict[str, str]], stream: bool = False) -> str:
        """
        与模型对话
        
        Args:
            messages: 消息列表
            stream: 是否流式返回
            
        Returns:
            str: 模型回复
        """
        pass
        
    @abstractmethod
    def get_embeddings(self, text: str) -> List[float]:
        """
        获取文本的嵌入向量
        
        Args:
            text: 输入文本
            
        Returns:
            List[float]: 嵌入向量
        """
        pass

class LLMServiceFactory:
    """LLM服务工厂类"""
    
    _providers = {}
    
    @classmethod
    def register(cls, provider: str, service_class: type):
        """注册LLM服务提供商"""
        cls._providers[provider] = service_class
        
    @classmethod
    def create(cls, provider: str = None, **kwargs) -> BaseLLMService:
        """
        创建LLM服务实例
        
        Args:
            provider: 服务提供商名称
            **kwargs: 其他参数
            
        Returns:
            BaseLLMService: LLM服务实例
        """
        from django.conf import settings
        
        # 如果没有指定提供商，使用默认提供商
        if provider is None:
            provider = settings.LLM_PROVIDERS.get('default_provider')
            
        logger.info(f"创建LLM服务: provider={provider}")
        
        # 获取提供商配置
        provider_config = settings.LLM_PROVIDERS.get(provider, {})
        
        # 合并配置
        merged_config = {**provider_config, **kwargs}
        
        # 获取服务类
        service_class = cls._providers.get(provider)
        if not service_class:
            raise ValueError(f"未找到LLM服务提供商: {provider}")
            
        # 创建服务实例
        return service_class(merged_config) 